package cc.owoo.godpen.network.reptile;

/**
 * 位置扫描器
 * Created by nimensei
 * 2022-05-02 上午 11:21
 **/
public abstract class LocationScan {
    /**
     * 监测该页面是否已经爬取过
     *
     * @param index 页面下标（从0开始）
     * @return 是否爬取过
     */
    public abstract boolean check(int index);

    /**
     * 开始扫描
     *
     * @param index 起始位置，下标从0开始
     * @param total 总页数
     * @return 扫描到的位置
     */
    public int scan(int index, int total) {
        return scanLocation(0, total, index);
    }

    /**
     * 使用二分查找来扫描未爬取的页面位置
     *
     * @param left  左边界
     * @param right 右边界
     * @return 扫描结果，如果为空则代表请求失败
     */
    private int scanLocation(int left, int right, int index) {
        if (index < 0)
            index = (int) Math.ceil((left + right) / 2d);
        else
            index = Math.max(left, Math.min(right, index));
        if (left >= right)
            return index;
        if (check(index))
            return scanLocation(index, right, -1);
        if (right - left == 1)
            return left;
        return scanLocation(left, index, -1);
    }
}
